package String.easy;

/**
 * 1. 问题描述
 *      统计字符串中的单词个数，这里的单词指的是连续的不是空格的字符。
 *      请注意，你可以假定字符串里不包括任何不可打印的字符。
 *
 *    具体的例子：
 *          输入: "Hello, my name is John"
 *          输出: 5
 *          解释: 这里的单词是指连续的不是空格的字符，所以 "Hello," 算作 1 个单词。
 *
 *
 *          判断一个字符串为单词的条件：
 *                 当前字符不空，当前字符的前一个字符为空
 *                 我们计算字符串的中单词数无非是计算出字符串中单词的下标个数
 *                 当然我们还需要判断当前字符是否为首字母
 *             首先我们需要明确到底那些才算符合题意的 '单词'
 *             我们日常认为的单词形如：hello,tom,apple等等
 *             但是依据题意" ",",,,","a,,"都算单词，即不是连续空格的字符串都当成单词
 *
 *             在编写代码之后的测试中发现了一些比较容易产生误会的地方：
 *                 1. "      "的长度不为0，有多少个空格该字符串的长度就是多少
 *                 2.,,,,之间没有空格，这算一个单词
 *                 3.
 *
 *             对于题目的转化：我们需要统计的是单词数，而官方给的解答将其转化为找符合题意的单词标
 *             的个数，将整个题转化为如何确定s中的单词是否为单词的条件，很巧妙，这种转化降低了代码的编写
 *             难度
 *
 *
 * 2. 算法分析
 *
 *
 * 3.代码实现
 *
 *
 */
public class 字符串中的单词数 {
    public static void main(String[] args) {

        System.out.println(countSegments2("hello, my name is tom"));
    }

    public static int countSegments(String s) {
        int count = 0; // 从1开始而0，因为如果当前s非空单词数至少为1
        int i = 0; // 指向当前单词的首字母
        for(int j = i+1; j < s.length()-1; j++) {
            if(s.charAt(j) != ' ') {
                continue;
            } else {
                if(s.charAt(j+1) != ' ') { // 判断当前是否为连续的空格，不是则为一个单词
                    count++;
                    i = j + 1;
                }
            }
        }
        return count;
    }

    /**
     * leetcode的官方解答 将题意转化为单词的判断条件的确定
     * @param s
     * @return
     */
    public static int countSegments2(String s) {
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            if ((i == 0 || s.charAt(i-1) == ' ') && s.charAt(i) != ' ') {
                count++;
            }
        }
        return count;
    }

    /**
     * 官方的第二种解答：调用Java有关的String的API解决
     *  主要是正则表达式的确定：\\s+  注意第一个\\不是正则而是转义作用，不参与正则的比较的
     *  　　量词：{m,n}：m到n个
     *
     * 　　　　　*：任意多个（贪婪匹配）
     *
     * 　　　　　+：一个到多个 (贪婪匹配)
     *
     * 　　　　　？：0或一个 （非贪婪匹配）
     */
    public static int countSegments3(String s) {
        String trimmed = s.trim(); // 去掉s的开头和末尾的空格
        if (trimmed.equals("")) {
            return 0;
        }
        return trimmed.split("\\s+").length; // 使用正则
    }
}
